r'''

Funktionen zur Berechnung von XTEA-Entschluesseln

'''
    
import struct
import platform

class XTEA():
    '''
Die Klasse implementiert den XTEA Algorithmus. In der ``__init__()`` - Funktion wird zuerst die Architektur
(32-Bit / 64-Bit) abgefragt, um das Problem der Blocklaenge abzufangen. Die Architektur kann durch den Module
``platform`` ermittelt werden.
    '''
    
    
    def __init__(self):
        self.DELTA = 0x9E3779B9L
        self.MASK = 0xffffffffL
        
        if platform.machine() == 'x86_64':# 64 Bit arch
            self.format = 'I'
        else:# 32 bit arch
            self.format = 'L'

    def strdecode(self, key, msg):
        '''
Hilfsfunktion, damit bei der Verschluesselung der Daten, die zu verschluesselte Nachricht 
nicht vorher Hexadezimal umgewandelt werden muss.

:param key: Schluessel (``str``)
:param msg: Nachrichten (``str``)

        '''
        z = msg.decode('hex')
        return self.xtea_decrypt(key, z, 32)
    
    def strencode(self, key, msg):
        '''
Hilfsfunktion, damit bei der Entschluesselung der Daten, die zu entschluesselte Nachricht 
nicht Hexadezimal umgewandelt werden muss.

:param key: Schluessel (``str``)
:param msg: Nachrichten (``str``)
        '''
        y = self.xtea_encrypt(key, msg, 32)
        return y.encode('hex')
       
    
    
    def xtea_encrypt(self, key,block,n=32):
        '''
            Die Funktion bildet die Verschluesslungsfunktion des XTEA Algorithmus ab. 
        '''
        
        v0,v1 = struct.unpack("2"+ self.format,block)
        k = struct.unpack("4"+ self.format,key)
        sum = 0L
        for round in range(n):
            v0 = (v0 + (((v1<<4 ^ v1>>5) + v1) ^ (sum + k[sum & 3]))) & self.MASK
            sum = (sum + self.DELTA) & self.MASK
            v1 = (v1 + (((v0<<4 ^ v0>>5) + v0) ^ (sum + k[sum>>11 & 3]))) & self.MASK
        return struct.pack("2" + self.format,v0,v1)

    def xtea_decrypt(self, key,block,n=32):
        '''
            Die Funktion bildet die Entschluesslungsfunktion des XTEA Algorithmus ab. 
        '''
       
        v0,v1 = struct.unpack("2"+ self.format,block)
        k = struct.unpack("4"+ self.format,key)
       
        sum = (self.DELTA * n) & self.MASK
        for round in range(n):
            v1 = (v1 - (((v0<<4 ^ v0>>5) + v0) ^ (sum + k[sum>>11 & 3]))) & self.MASK
            sum = (sum - self.DELTA) & self.MASK
            v0 = (v0 - (((v1<<4 ^ v1>>5) + v1) ^ (sum + k[sum & 3]))) & self.MASK
        return struct.pack("2"+ self.format,v0,v1)


       
